package basic;

import java.util.Set;

import com.google.common.base.Optional;
/**
 * Optional是一个避免空值的转换类，他可以包装任何类型。
 * 用它的缺省值表示null，用它的Present表示当前非空
 * @author tiangh
 * 2013-5-25 下午9:48:09
 */
public class OptionalDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		optionalLogic();
	}
	
	/**
	 * Optional的三种构造方法
	 */
	public static void optionalCconstructor() {
		// 如果对possible赋值，则isPresent为真
		Optional<Integer> possible = Optional.of(5);
		System.out.println(possible.isPresent());

		// 如果通过absent方法来构造Optional，即给它赋为缺省值，此时isPresent为假
		possible = Optional.absent();
		System.out.println(possible.isPresent());

		// 通过fromNullable方法来构造Optional，如果值为null，则返回缺省值，否则赋值为Present
		possible = Optional.fromNullable(null);
		System.out.println(possible.isPresent());
		possible = Optional.fromNullable(3);
		System.out.println(possible.isPresent());
	}
	
	public static void optionalLogic() {
		//当possible本身为真，它or另外一个参数的结果是返回它本身
		Optional<Integer> possible = Optional.of(5);
		Integer or = possible.or(8);
		System.out.println(or);
		System.out.println("orNull="+possible.orNull());
		
		//asSet返回一个不可修改的单例Set或者空Set(当为缺省值时)
		Set<Integer> set = possible.asSet();
		System.out.println(set);
		
		//当possible本身为缺省值，它or另外一个参数的结果是返回参数
		//orNull时，返回参数null
		possible=Optional.absent();
		or=possible.or(8);
		System.out.println(or);
		System.out.println("orNull="+possible.orNull());
		
		set = possible.asSet();
		System.out.println(set);
	}

}
